package com.bitoon.basketdudes.web.jpa;

import com.bitoon.basketdudes.web.datos.EstadisticaEquipo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;

@Entity
@Table(name = "equipo", schema="basket")

@NamedQueries({
    @NamedQuery(name = "Equipo.findByIdUsuario",
        query = "SELECT e FROM Equipo e WHERE e.usuario.id = :idUsuario"),
    @NamedQuery(name = "Equipo.findById",
        query = "SELECT e FROM Equipo e WHERE e.id = :idEquipo"),
    @NamedQuery(name = "Equipo.findByNombreUrl",
        query = "SELECT e FROM Equipo e WHERE e.nombreUrl = :nombre"),
    @NamedQuery(name = "Equipo.findByFirstLetters",
        query = "SELECT e FROM Equipo e WHERE e.nombre >= :letraDesde and e.nombre < :letraHasta ORDER BY e.nombre"),
    @NamedQuery(name = "Equipo.findMejorAtaque",
        query = "SELECT e FROM Equipo e WHERE e.estadisticas.partidos > 0 ORDER BY (e.estadisticas.puntos/e.estadisticas.partidos) DESC"),
    @NamedQuery(name = "Equipo.findMejorDefensa",
        query = "SELECT e FROM Equipo e WHERE e.estadisticas.partidos > 0 ORDER BY (e.estadisticas.puntosContra/e.estadisticas.partidos)"),
    @NamedQuery(name = "Equipo.findMejorAtaqueByIdUsuario",
        query = "SELECT e FROM Equipo e WHERE e.usuario.id = :idUsuario AND e.estadisticas.partidos > 0 ORDER BY (e.estadisticas.puntos/e.estadisticas.partidos) DESC"),
    @NamedQuery(name = "Equipo.findMejorDefensaByIdUsuario",
        query = "SELECT e FROM Equipo e WHERE e.usuario.id = :idUsuario AND e.estadisticas.partidos > 0 ORDER BY (e.estadisticas.puntosContra/e.estadisticas.partidos)")
})

public class Equipo implements Serializable {

    private static long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name="equipo_id_generator", sequenceName="basket.equipo_id_seq", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="equipo_id_generator")
    @Basic(optional=false)
    private Integer id;

    @ManyToOne
    @JoinColumn(name="usuario_id")
    private Usuario usuario;

    private String nombre;

    @Column(name="nombre_url")
    private String nombreUrl;

    private String nick;
    @Column(name="f_alta")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaAlta;

    private Integer puntos;
    @Column(name="jugadores_max")
    private Integer maxJugadores;
    @Column(name="m_entrenador_id")
    private Integer idEntrenador;
    private int nivel = 0;
    private int experiencia = 0;
    private float   powerplay;
    @Column(name="credito_talento")
    private int creditoTalento;
    private int status;

    @OneToMany(mappedBy="equipo", fetch=FetchType.LAZY)
    @OrderBy("dorsal")
    private List<Plantilla> plantilla;

    @OneToOne
    @JoinColumn(name="id", insertable=false, updatable=false)
    private EstEquipo estadisticas;

    @OneToOne
    @JoinColumn(name="id", insertable=false, updatable=false)
    private Ranking ranking;

    @OneToOne
    @JoinColumn(name = "id", referencedColumnName = "equipo_id", insertable = false, updatable = false)
    private AspectoEquipo aspecto;

    @Transient
    private EstadisticaEquipo estadisticaEquipo;

    @Transient
    private String nombreCompleto;
    public String getNombreCompleto() {
        return nombre + " " + nick;
    }

    @Transient
    private String iniciales;
    public String getIniciales() {
        return (nombre.substring(0,1) + nick.substring(0,2)).toUpperCase();
    }

    public EstadisticaEquipo getEstadisticaEquipo() {
        this.estadisticaEquipo = new EstadisticaEquipo();
        estadisticaEquipo.calculaMedia(plantilla);
        return this.estadisticaEquipo;
    }

    public void setEstadisticaEquipo(EstadisticaEquipo estadisticaEquipo) {
        this.estadisticaEquipo = estadisticaEquipo;
    }

    public void Equipo() {
        this.plantilla = new ArrayList<Plantilla>();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getNick() {
        return nick;
    }

    public void setNick(String nick) {
        this.nick = nick;
    }

    public Date getFechaAlta() {
        return fechaAlta;
    }

    public void setFechaAlta(Date fechaAlta) {
        this.fechaAlta = fechaAlta;
    }

    public Integer getPuntos() {
        return puntos;
    }

    public void setPuntos(Integer puntos) {
        this.puntos = puntos;
    }

    public Integer getMaxJugadores() {
        return maxJugadores;
    }

    public void setMaxJugadores(Integer maxJugadores) {
        this.maxJugadores = maxJugadores;
    }

    public Integer getIdEntrenador() {
        return idEntrenador;
    }

    public void setIdEntrenador(Integer idEntrenador) {
        this.idEntrenador = idEntrenador;
    }

    public Integer getNivel() {
        return nivel;
    }

    public void setNivel(Integer nivel) {
        this.nivel = nivel;
    }

    public Integer getExperiencia() {
        return experiencia;
    }

    public void setExperiencia(Integer experiencia) {
        this.experiencia = experiencia;
    }

    public float getPowerplay() {
        return powerplay;
    }

    public void setPowerplay(float powerplay) {
        this.powerplay = powerplay;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getNombreUrl() {
        return Integer.toString(id);
        //return nombreUrl;
    }

    public void setNombreUrl(String nombreUrl) {
        this.nombreUrl = nombreUrl;
    }

    public List<Plantilla> getPlantilla() {
        return this.plantilla;
    }

    public void setPlantilla(List<Plantilla> plantilla) {
        estadisticaEquipo.calculaMedia(plantilla);
        this.plantilla = plantilla;
    }

    public EstEquipo getEstadisticas() {
        return estadisticas;
    }

    public void setEstadisticas(EstEquipo estadisticas) {
        this.estadisticas = estadisticas;
    }

    public Ranking getRanking() {
        return ranking;
    }

    public void setRanking(Ranking ranking) {
        this.ranking = ranking;
    }

    public AspectoEquipo getAspecto() {
        return this.aspecto;
    }

    public void setAspecto(AspectoEquipo aspecto) {
        this.aspecto = aspecto;
    }

    public float getMedia() {
        float retorno = 12f;

        retorno = (float)this.plantilla.size();
        /*
        if (this.plantilla.size() > 0) {
            for (Plantilla j : this.plantilla) {
                retorno += j.getJugador().getMedia();
            }
            retorno = retorno/this.plantilla.size();
        }
         *
         */

        return retorno;

    }

    public int getCreditoTalento() {
        return creditoTalento;
    }

    public void setCreditoTalento(int creditoTalento) {
        this.creditoTalento = creditoTalento;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}